package com.serviportales.serviquality.reportes.beans;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.swing.tree.DefaultMutableTreeNode;

import org.apache.log4j.Logger;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

import com.liferay.util.bridges.jsf.common.FacesMessageUtil;
import com.serviportales.serviportales.beans.Contexto;
import com.serviportales.serviportales.model.GenericNodeUserObject;
import com.serviportales.serviportales.model.GenericTreeModel;
import com.serviportales.serviportales.utils.BeansUtils;
import com.serviportales.serviportales.utils.SessionUtils;
import com.serviportales.serviquality.managers.MgrCalProyectoNodo;
import com.serviportales.serviquality.model.CalProyectoNodo;
import com.serviportales.serviquality.model.ProyectoUser;

@ManagedBean(name = "fcTreeProyecto", eager = true)
@ViewScoped
public class FCTreeProyecto implements Serializable {

	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(getClass());

	private ProyectoUser proyectoUser;
	private String strCharData;

	// Tree
	private DefaultMutableTreeNode dmTreeNodeSelected;
	private GenericTreeModel<CalProyectoNodo> proyectoTreeModel;

	public ProyectoUser getProyectoUser() {
		return proyectoUser;
	}

	public void setProyectoUser(ProyectoUser proyectoUser) {
		this.proyectoUser = proyectoUser;

		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			MgrCalProyectoNodo mgrCalProyectoNodo = ((MgrCalProyectoNodo) Contexto.getApplicationContext().getBean("mgrCalProyectoNodo"));
			proyectoTreeModel = mgrCalProyectoNodo.createTree(proyectoUser);
			setCharData((DefaultMutableTreeNode) proyectoTreeModel.getRoot());
		} catch (Exception exception) {
			FacesMessageUtil.error(context, messageSource.getMessage(exception.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(exception.getMessage(), exception);
		}
	}

	public DefaultMutableTreeNode getDmTreeNodeSelected() {
		return dmTreeNodeSelected;
	}

	public void setDmTreeNodeSelected(DefaultMutableTreeNode dmTreeNodeSelected) {
		this.dmTreeNodeSelected = dmTreeNodeSelected;
	}

	public GenericTreeModel<CalProyectoNodo> getProyectoTreeModel() {
		return proyectoTreeModel;
	}

	public void setProyectoTreeModel(GenericTreeModel<CalProyectoNodo> proyectoTreeModel) {
		this.proyectoTreeModel = proyectoTreeModel;
	}

	public String getStrCharData() {
		return strCharData;
	}

	public void setStrCharData(String strCharData) {
		this.strCharData = strCharData;
	}

	@PostConstruct
	public void init() {
		proyectoTreeModel = new GenericTreeModel<CalProyectoNodo>();
		proyectoTreeModel.setRootNode("", new CalProyectoNodo());
		dmTreeNodeSelected = (DefaultMutableTreeNode) proyectoTreeModel.getRoot();
	}

	@SuppressWarnings("unchecked")
	private void setCharData(DefaultMutableTreeNode defaultMutableTreeNode) throws Exception {

		StringBuffer strBuffer;
		if (!defaultMutableTreeNode.getAllowsChildren()) {
			strBuffer = new StringBuffer("new Array()");
		} else {
			strBuffer = new StringBuffer("");
			for (int i = 0; i < defaultMutableTreeNode.getChildCount(); i++) {
				DefaultMutableTreeNode childNode = (DefaultMutableTreeNode) defaultMutableTreeNode.getChildAt(i);
				CalProyectoNodo calProyectoNodo = ((GenericNodeUserObject<CalProyectoNodo>) childNode.getUserObject()).getValue();
				strBuffer.append(",{direction:\"" + BeansUtils.getDatoAtributo(calProyectoNodo, "proyectoNodo.proyectoNodoPK.nodo.nombre", " ") + "\", value:" + BeansUtils.getDatoAtributo(calProyectoNodo, "proyectoNodo.calificacion", 0L) + ", esperado:" + BeansUtils.getDatoAtributo(calProyectoNodo, "proyectoNodo.valorEsperado", 0L) + "}");
			}
			strBuffer = new StringBuffer("[" + strBuffer.substring(1) + "]");
		}
		strCharData = strBuffer.toString();
	}

	public void nodeSelected(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			String idNodo = SessionUtils.getRequesParameter(context, "idNodo");
			dmTreeNodeSelected = proyectoTreeModel.findNode(idNodo);
			setCharData(dmTreeNodeSelected);
		} catch (Exception exception) {
			FacesMessageUtil.error(context, messageSource.getMessage(exception.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(exception.getMessage(), exception);
		}
	}

	public void refreshProyecto() {
		FacesContext context = FacesContext.getCurrentInstance();
		MessageSource messageSource = Contexto.getMessageSource();
		try {
			MgrCalProyectoNodo mgrCalProyectoNodo = ((MgrCalProyectoNodo) Contexto.getApplicationContext().getBean("mgrCalProyectoNodo"));
			proyectoTreeModel = mgrCalProyectoNodo.createTree(proyectoUser);
			setCharData((DefaultMutableTreeNode) proyectoTreeModel.getRoot());
		} catch (Exception exception) {
			FacesMessageUtil.error(context, messageSource.getMessage(exception.getMessage(), null, LocaleContextHolder.getLocale()));
			logger.error(exception.getMessage(), exception);
		}
	}
}
